package com.saydc.actions.puestos.especifico;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.saydc.dao.ExpertiseDAO;
import com.saydc.dao.PuestosDAO;
import com.saydc.dao.UnidadOrganizativaDAO;
import com.saydc.exceptions.UnableToDeleteException;
import com.saydc.forms.puestos.especifico.ActualizaPuestoEspecificoForm;
import com.saydc.model.Expertise;
import com.saydc.model.Puesto;
import com.saydc.model.PuestoEspecifico;
import com.saydc.model.UnidadOrganizativa;

public class AccionPuestosEspecificosAction extends DispatchAction {

	@SuppressWarnings("unchecked")
	public ActionForward editar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		ArrayList<PuestoEspecifico> listaPuestosEspecificos = (ArrayList<PuestoEspecifico>)request.getSession().getAttribute("listaPuestosEspecificos");
		String indexPuesto = request.getParameter("index");
		PuestoEspecifico puesto = listaPuestosEspecificos.get(Integer.parseInt(indexPuesto));
		request.getSession().setAttribute("puesto", puesto);
		
		UnidadOrganizativaDAO unidadesDao = UnidadOrganizativaDAO.getInstance();
		List<UnidadOrganizativa> listaUnidades = (List<UnidadOrganizativa>)unidadesDao.getAreasOrganizativas();
		request.getSession().setAttribute("listaUnidades", listaUnidades);
		
		PuestosDAO puestosDao = PuestosDAO.getInstance();
		List<Puesto> listaPuestos = (List<Puesto>)puestosDao.getPuestosGenericos();
		request.getSession().setAttribute("listaPuestos", listaPuestos);
		
		ExpertiseDAO expertiseDao = ExpertiseDAO.getInstance();
		List<Expertise> listaExpertises = (List<Expertise>)expertiseDao.getExpertises();
		request.getSession().setAttribute("listaExpertises", listaExpertises);
		
		return mapping.findForward("editarPuestoEspecifico");
	}
	
	@SuppressWarnings("unchecked")
	public ActionForward borrar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response){
		
		ArrayList<PuestoEspecifico> listaPuestosEspecificos = (ArrayList<PuestoEspecifico>)request.getSession().getAttribute("listaPuestosEspecificos");
		String indexPuesto = request.getParameter("index");
		PuestoEspecifico puesto = listaPuestosEspecificos.get(Integer.parseInt(indexPuesto));
		request.getSession().setAttribute("puesto", puesto);
		PuestosDAO dao = PuestosDAO.getInstance();
		try{
			dao.borrarPuesto(puesto);
		}catch(UnableToDeleteException e){
			return mapping.findForward("failure");
		}
		return mapping.findForward("success");
	}
	
	public ActionForward confirmaEditar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		PuestoEspecifico puesto = (PuestoEspecifico)request.getSession().getAttribute("puesto");
		ActualizaPuestoEspecificoForm puestoForm = (ActualizaPuestoEspecificoForm)form;
		
		PuestosDAO puestoDao = PuestosDAO.getInstance();
		UnidadOrganizativaDAO uniDao = UnidadOrganizativaDAO.getInstance();
		
		puesto.setNombrePuesto(puestoForm.getNombre());
		puesto.setIdPuestoGenerico(puestoDao.getPuesto(puestoForm.getPuestoGenerico()));
		puesto.setIdUnidad(uniDao.getUnidadOrganizativa(puestoForm.getUnidadOrganizativa()));
		puesto.setRemuneracionMinima(Double.parseDouble(puestoForm.getRemMinima()));
		puesto.setRemuneracionMaxima(Double.parseDouble(puestoForm.getRemMaxima()));
		
		int[] expertises = puestoForm.getSeleccionados();
		Set<Expertise> expRequeridos = new HashSet<Expertise>();
		for(int i=0; i<expertises.length; i++){
			expRequeridos.add(Expertise.getTipoExpertise(expertises[i]));
		}
		puesto.setExpertiseRequerido(expRequeridos);
		
		PuestosDAO dao = PuestosDAO.getInstance();
		dao.actualizarPuesto(puesto);
		return mapping.findForward("success");
	}
	
}
